最近小忙,这次水一波。
Finally, HotSpot终于能比较好的利用现代CPU的SIMD了。
- 现况
- Hotspot 支持一部分的x86 SIMD指令。
- C2能做Superword Optimaztion。
- 数组的拷贝、填充、比较都默认SIMD化了。
- JVM Intrinsics
- @HotSpotIntrinsicCandidate说明函数实现被JVM用手写汇编或者IR优化了。
已经被优化的:
- 除了上面说的还有Arrays.equals();
- Array.mismatch()(Java9)。
SuperWord Optimzation
只在C2
只能在unrolled的counted循环做优化。
Counted 循环 是是只有单出口的循环。
- 1234567for (int i = start; i < limit; i+=stride) {// loop body}int i = start; while (i < limit) {// loop bodyi+=stride;}
可以使用-XX:+PrintCompilation -XX:+TraceLoopOpts查看,或者-XX:+PrintAssembly看生成的代码。
- Counted Loop: N100/N83 limit_check predicated counted [0,100),+1 (-1 iters)
Vector Box Elimination
- 目前还比较brittle。
- 这种优化只能解决一些问题,不是通用的优化。
- JNI很难开发和维护。
- 注意,手动unroll的代码是不能向量化的。
- Hotspot团队的实验:
- X86性能优化大概3-8%。
- 1.5X的性能提升在vector centric micros。